﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace B2BCore
{
    /// <summary>
    /// Classes and functions for encryptions
    /// </summary>
    public class Encryption
    {
        /// <summary>
        /// Internal class for using MD5
        /// </summary>
        public static class MessageDigest5
        {
            /// <summary>
            /// Hash an input string and return the hash as a 32 character hexadecimal string.
            /// </summary>
            /// <param name="input">The string to encrypt</param>
            /// <returns></returns>
            static string getMd5Hash(string input)
            {
                // Create a new instance of the MD5CryptoServiceProvider object.
                MD5 md5Hasher = MD5.Create();

                // Convert the input string to a byte array and compute the hash.
                byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));

                // Create a new Stringbuilder to collect the bytes
                // and create a string.
                StringBuilder sBuilder = new StringBuilder();

                // Loop through each byte of the hashed data 
                // and format each one as a hexadecimal string.
                for (int i = 0; i < data.Length; i++)
                {
                    sBuilder.Append(data[i].ToString("x2"));
                }

                // Return the hexadecimal string.
                return sBuilder.ToString();
            }

            
            /// <summary>
            /// Takes a string and hashes it for comparison to another hash
            /// </summary>
            /// <param name="input">The string to be hashed and compared</param>
            /// <param name="hash">The hash for comparison</param>
            /// <returns></returns>
            static bool verifyMd5Hash(string input, string hash)
            {
                // Hash the input.
                string hashOfInput = getMd5Hash(input);

                // Create a StringComparer an compare the hashes.
                StringComparer comparer = StringComparer.OrdinalIgnoreCase;

                if (0 == comparer.Compare(hashOfInput, hash))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
        }
    }
}
